A variety of computer applications operate on messages to create a message residue. The residue can represent message contents much more compactly. Among other uses, message residues are frequently used to determine whether data transmitted over network connections or retrieved from a storage device may have been corrupted. For instance, a noisy transmission line may change a “1” signal to a “0”, or vice versa. To detect corruption, a message is often accompanied by its message residue. A receiver of the data can then independently determine a residue for the message and compare the determined residue with the received residue.
A common message residue is known as a Cyclic Redundancy Check (CRC). A CRC computation is based on interpreting a stream of message bits as coefficients of a polynomial. For example, a message of “1010” corresponds to a polynomial of (1 x3)+(0 x2)+(1 x1)+(0 x0) or, more simply, x3+x1. The message polynomial is divided by another polynomial known as the modulus. For example, the other polynomial may be “11” or x+1. A CRC is the remainder of a division of the message by the polynomial. CRC polynomial division, however, is somewhat different than ordinary division in that it is computed over the finite field GF(2) (i.e., the set of integers modulo 2). More simply put: even number coefficients become zeroes and odd number coefficients become ones.